package v1

import (
	"fmt"
	"github.com/aliyun/aliyun-oss-go-sdk/oss"
	"github.com/gin-gonic/gin"
	"maya-service/model/po"
	"maya-service/server/web/middleware"
	"maya-service/utils"
	"os"
	"strings"
)

var Oss = &aliOss{}

func init() {
	RegisterRouter(Oss)
}

type aliOss struct{}

// Init
func (a *aliOss) Init(r *gin.RouterGroup) {
	g := r.Group("/oss", middleware.Auth())
	{
		// 上传图片
		g.POST("/putObject", a.putObject)
		// 删除图片
		g.POST("/deleteObject", a.deleteObject)
		// 更换图片
		g.POST("/changeObject", a.changeObject)
	}
}

// putObject 上传文件
func (a *aliOss) putObject(c *gin.Context) {
	// 保存文件
	filePath, err := UploadImage(c)
	if err != nil {
		c.Error(err)
		return
	}

	defer func() {
		os.Remove(filePath)
	}()

	os.Setenv("OSS_ACCESS_KEY_ID", "LTAI5tS3Szc3kdFQiPLoF5vq")
	os.Setenv("OSS_ACCESS_KEY_SECRET", "zTJoJSIwvs7xCF8EEwxGLdRpzbEgya")
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		c.Error(err)
		return
	}

	// 创建OSSClient实例。
	// yourEndpoint填写Bucket对应的Endpoint，以华东1（杭州）为例，填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
	client, err := oss.New("oss-cn-beijing.aliyuncs.com", "LTAI5tS3Szc3kdFQiPLoF5vq", "zTJoJSIwvs7xCF8EEwxGLdRpzbEgya", oss.SetCredentialsProvider(&provider))
	if err != nil {
		c.Error(err)
		return
	}

	// 填写存储空间名称，例如examplebucket。
	bucket, err := client.Bucket("shengu-quiz")
	if err != nil {
		c.Error(err)
		return
	}

	fileDatas := strings.Split(filePath, "/")
	fileName := fileDatas[len(fileDatas)-1]
	// 依次填写Object的完整路径（例如exampledir/exampleobject.txt）和本地文件的完整路径（例如D:\\localpath\\examplefile.txt）。

	err = bucket.PutObjectFromFile(fmt.Sprintf("maya/%v", fileName), filePath)
	if err != nil {
		c.Error(err)
		return
	}

	type Ret struct {
		Image    string `json:"image"`
		FileName string `json:"file_name"`
		Url      string `json:"url"`
	}
	utils.ResponseOk(c, &Ret{
		Image:    fileName,
		FileName: "maya",
		Url:      fmt.Sprintf("https://shengu-quiz.oss-accelerate.aliyuncs.com/maya/%v", fileName),
	})
}

// changeObject 更换图片
func (a *aliOss) changeObject(c *gin.Context) {
	var (
		in  = &po.ChangeImageReq{}
		err error
	)

	if err = c.ShouldBindJSON(in); err != nil {
		c.Error(err)
		return
	}

	os.Setenv("OSS_ACCESS_KEY_ID", "LTAI5tS3Szc3kdFQiPLoF5vq")
	os.Setenv("OSS_ACCESS_KEY_SECRET", "zTJoJSIwvs7xCF8EEwxGLdRpzbEgya")
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		c.Error(err)
		return
	}

	// 创建OSSClient实例。
	// yourEndpoint填写Bucket对应的Endpoint，以华东1（杭州）为例，填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
	client, err := oss.New("oss-cn-beijing.aliyuncs.com", "LTAI5tS3Szc3kdFQiPLoF5vq", "zTJoJSIwvs7xCF8EEwxGLdRpzbEgya", oss.SetCredentialsProvider(&provider))
	if err != nil {
		c.Error(err)
		return
	}

	// 填写存储空间名称，例如examplebucket。
	bucket, err := client.Bucket("shengu-quiz")
	if err != nil {
		c.Error(err)
		return
	}

	// 依次填写Object的完整路径（例如exampledir/exampleobject.txt）和本地文件的完整路径（例如D:\\localpath\\examplefile.txt）。
	err = bucket.DeleteObject(fmt.Sprintf("maya/%v", in.SrcImageUrl))
	if err != nil {
		c.Error(err)
		return
	}

	// 上传图片
	a.putObject(c)
}

// deleteObject 删除图片
func (a *aliOss) deleteObject(c *gin.Context) {
	var (
		in  = &po.DeleteImageReq{}
		err error
	)

	if err = c.ShouldBindJSON(in); err != nil {
		c.Error(err)
		return
	}

	os.Setenv("OSS_ACCESS_KEY_ID", "LTAI5tS3Szc3kdFQiPLoF5vq")
	os.Setenv("OSS_ACCESS_KEY_SECRET", "zTJoJSIwvs7xCF8EEwxGLdRpzbEgya")
	provider, err := oss.NewEnvironmentVariableCredentialsProvider()
	if err != nil {
		c.Error(err)
		return
	}

	// 创建OSSClient实例。
	// yourEndpoint填写Bucket对应的Endpoint，以华东1（杭州）为例，填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
	client, err := oss.New("oss-cn-beijing.aliyuncs.com", "LTAI5tS3Szc3kdFQiPLoF5vq", "zTJoJSIwvs7xCF8EEwxGLdRpzbEgya", oss.SetCredentialsProvider(&provider))
	if err != nil {
		c.Error(err)
		return
	}

	// 填写存储空间名称，例如examplebucket。
	bucket, err := client.Bucket("shengu-quiz")
	if err != nil {
		c.Error(err)
		return
	}

	fileDatas := strings.Split(in.ImageUrl, "/")
	fileName := fileDatas[len(fileDatas)-1]
	// 依次填写Object的完整路径（例如exampledir/exampleobject.txt）和本地文件的完整路径（例如D:\\localpath\\examplefile.txt）。
	err = bucket.DeleteObject(fmt.Sprintf("maya/%v", fileName))
	if err != nil {
		c.Error(err)
		return
	}
	utils.ResponseOk(c, nil)
}
